package gcp.gui;

import gcp.Gibi;
import gcp.enums.ClassificacaoEtaria;
import gcp.enums.GibiEstado;
import gcp.enums.ItemEstado;
import gcp.principal.FrameGCP;
import gcp.principal.GCP;

import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JInternalFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.ScrollPaneConstants;

/**
 * FrameGibi<br>
 * Frame responsavel pela criacao/edicao de gibis.
 * @author Hildegard Furtado
 */
public class FrameGibi extends JInternalFrame {

    private static final long serialVersionUID = 1L;
    private FrameGCP frameGcp;
    private GCP gcp;
    private Container tela;
    private JLabel textoTitulo, textoQuemPublicou, textoAno, textoCensura,
            textoItemEstado, textoEstado, textoComentarios, textoNota;
    private JTextField campoTitulo, campoQuemPublicou, campoAno;
    private JTextArea campoComentarios;
    private JComboBox comboCensura, comboItemEstado, comboGibiEstado;
    private JButton botaoOk, botaoSair, botaoLimpar, botaoMais, botaoMenos;
    private Gibi gibi;
    private PainelNota nota;
    private JScrollPane barraDeRolagem;

    /**
     * Construtor para o FrameGibi.
     * @param frameGcp Frame principal do GCP.
     */
    public FrameGibi(FrameGCP frameGcp, Gibi gibi) {
        super("Cadastros Gibi");
        this.frameGcp = frameGcp;
        this.gibi = gibi;
        gcp = frameGcp.getGcp();
        inicializar();
        posicoes();
        acoes();
        constroiTela();
        carregar();
    }

    /**
     * Carrega os dados do Gibi em tela.
     */
    private void carregar() {
        if (gibi != null) {
            campoAno.setText(gibi.getAno() + "");
            campoComentarios.setText(gibi.getComentarios());
            nota.setNota(gibi.getNota());
            campoQuemPublicou.setText(gibi.getQuemPublicou());
            campoTitulo.setText(gibi.getTitulo());
            comboCensura.setSelectedItem(gibi.getClassificacaoEtaria());
            comboGibiEstado.setSelectedItem(gibi.getGibiEstado());
            comboItemEstado.setSelectedItem(gibi.getItemEstado());
        }
    }

    /**
     * Inicializa os componentes.
     */
    private void inicializar() {
        setSize(600, 500);
        setClosable(true);
        tela = getContentPane();
        tela.setLayout(null);

        textoTitulo = new JLabel("Título: ");
        textoQuemPublicou = new JLabel("Publicado por: ");
        textoAno = new JLabel("Ano de publicação: ");
        textoEstado = new JLabel("Estado de conservação: ");
        textoCensura = new JLabel("Classificação etária: ");
        textoItemEstado = new JLabel("Estado do Gibi: ");
        textoComentarios = new JLabel("Comentários Adicionais: ");
        textoNota = new JLabel("Nota: ");
        nota = new PainelNota();

        campoTitulo = new JTextField();
        campoQuemPublicou = new JTextField();
        campoAno = new JTextField();

        campoComentarios = new JTextArea(350, 700);
        campoComentarios.setLineWrap(true);
        campoComentarios.setWrapStyleWord(true);

        barraDeRolagem = new JScrollPane(campoComentarios);
        barraDeRolagem
                .setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);

        botaoOk = new JButton("Ok");
        botaoLimpar = new JButton("Limpar");
        botaoSair = new JButton("sair");
        botaoMais = new JButton("+");
        botaoMenos = new JButton("-");

        comboCensura = new JComboBox();

        comboCensura.addItem(ClassificacaoEtaria.SELECIONAR);
        comboCensura.addItem(ClassificacaoEtaria.LIVRE);
        comboCensura.addItem(ClassificacaoEtaria.DOZE);
        comboCensura.addItem(ClassificacaoEtaria.QUARTOZE);
        comboCensura.addItem(ClassificacaoEtaria.DEZESSEIS);
        comboCensura.addItem(ClassificacaoEtaria.DEZOITO);
        comboCensura.addItem(ClassificacaoEtaria.DESCONHECIDO);

        comboItemEstado = new JComboBox();

        comboItemEstado.addItem(ItemEstado.SELECIONAR);
        comboItemEstado.addItem(ItemEstado.FALTANDO);
        comboItemEstado.addItem(ItemEstado.EMPRESTADO);
        comboItemEstado.addItem(ItemEstado.COMIGO);

        comboGibiEstado = new JComboBox();

        comboGibiEstado.addItem(GibiEstado.SELECIONAR);
        comboGibiEstado.addItem(GibiEstado.AMASSADO);
        comboGibiEstado.addItem(GibiEstado.CONSERVADO);
        comboGibiEstado.addItem(GibiEstado.RASGADO);
        comboGibiEstado.addItem(GibiEstado.RISCADO);
        comboGibiEstado.addItem(GibiEstado.SEM_CAPA);
    }

    /**
     * Define a posicao dos componentes em tela.
     */
    private void posicoes() {
        textoTitulo.setBounds(10, 10, 40, 27);
        campoTitulo.setBounds(45, 10, 450, 27);
        textoQuemPublicou.setBounds(10, 40, 100, 27);
        campoQuemPublicou.setBounds(93, 40, 450, 27);
        textoAno.setBounds(10, 70, 110, 27);
        campoAno.setBounds(115, 70, 60, 27);
        textoCensura.setBounds(10, 100, 130, 27);
        comboCensura.setBounds(143, 100, 120, 27);
        textoItemEstado.setBounds(10, 130, 130, 27);
        comboItemEstado.setBounds(143, 130, 120, 27);
        textoEstado.setBounds(10, 160, 135, 27);
        comboGibiEstado.setBounds(143, 160, 120, 27);
        textoComentarios.setBounds(10, 190, 150, 27);
        barraDeRolagem.setBounds(10, 215, 350, 200);
        textoNota.setBounds(300, 130, 50, 27);
        botaoMenos.setBounds(350, 160, 35, 27);
        nota.setBounds(385, 160, 25, 26);
        botaoMais.setBounds(410, 160, 35, 27);

        botaoOk.setBounds(440, 300, 100, 27);
        botaoLimpar.setBounds(440, 340, 100, 27);
        botaoSair.setBounds(440, 380, 100, 27);
    }

    /**
     * Define as acoes dos objetos.
     */
    private void acoes() {
        // Ao apertar o botao ok confirmar o cadastro do Gibi
        botaoOk.addActionListener(new ActionListener() {
            
            public void actionPerformed(ActionEvent arg0) {
                cadastrar();
            }
        });
        // Ao apertar o botao limpar limpa os campos preenchidos
        botaoLimpar.addActionListener(new ActionListener() {

            
            public void actionPerformed(ActionEvent e) {

                campoTitulo.setText(null);
                campoQuemPublicou.setText(null);
                campoAno.setText(null);
                campoComentarios.setText(null);
                comboGibiEstado.setSelectedItem("Selecionar");
                comboCensura.setSelectedItem("Selecionar");
                comboItemEstado.setSelectedItem("Selecionar");
            }
        });
        // Aumenta a nota dada ao Gibi
        botaoMais.addActionListener(new ActionListener() {
            
            public void actionPerformed(ActionEvent e) {
                nota.incrementar();
            }
        });
        // Decrementa a nota dada ao Gibi
        botaoMenos.addActionListener(new ActionListener() {
            
            public void actionPerformed(ActionEvent e) {
                nota.decrementar();
            }
        });
        // fecha a janela ao apertar o botao sair
        botaoSair.addActionListener(new ActionListener() {

            
            public void actionPerformed(ActionEvent e) {
                dispose();

            }
        });
    }

    /**
     * Cria um Gibi e Adiciona as informacoes obtidas ao cadastro do Gibi, por
     * fim adicona-o a conta do Usuario
     */
    protected void cadastrar() {
        boolean novo = (gibi == null);
        String titulo = campoTitulo.getText();
        String quemPublicou = campoQuemPublicou.getText();
        int ano = Integer.parseInt(campoAno.getText());
        String comentarios = campoComentarios.getText();

        try {
            if (novo)
                gibi = new Gibi();
            if (titulo.isEmpty()) {
                frameGcp.exibirMensagem("Campo título deve ser preenchido");
                return;
            }
            gibi.setTitulo(titulo);
            gibi.setQuemPublicou(quemPublicou);
            gibi.setAno(ano);
            gibi.setComentarios(comentarios);
            gibi.setItemEstado((ItemEstado) comboItemEstado.getSelectedItem());
            gibi.setGibiEstado((GibiEstado) comboGibiEstado.getSelectedItem());
            gibi.setClassificacaoEtaria((ClassificacaoEtaria) comboCensura
                    .getSelectedItem());
            gibi.setNota(nota.getNota());

            if (novo)
                gcp.adicionaItens(frameGcp.getUsuarioLogado(), gibi);
            dispose();
        } catch (Exception e) {
            frameGcp.exibirMensagem(e.getMessage());
        }
    }

    /**
     * Adiciona componentes em tela.
     */
    private void constroiTela() {
        tela.add(textoTitulo);
        tela.add(textoAno);
        tela.add(textoCensura);
        tela.add(textoEstado);
        tela.add(textoItemEstado);
        tela.add(textoQuemPublicou);
        tela.add(textoComentarios);

        tela.add(campoTitulo);
        tela.add(campoQuemPublicou);
        tela.add(campoAno);

        tela.add(barraDeRolagem);

        tela.add(nota);
        tela.add(textoNota);

        tela.add(botaoOk);
        tela.add(botaoMais);
        tela.add(botaoMenos);
        tela.add(botaoLimpar);
        tela.add(botaoSair);

        tela.add(comboCensura);
        tela.add(comboGibiEstado);
        tela.add(comboItemEstado);
    }
}